package collection;

public class MyArrayList<T> {
    private T[] data;
    private int size; // 用于跟踪当前数组中实际存储的元素数量

    public MyArrayList() {
        data = (T[]) new Object[10];
        size = 0;
    }

    /**
     * 向集合中添加一个元素
     *
     * @param t 要添加的元素
     * @return 如果添加成功，则返回 true
     */
    public boolean add(T t) {
        if (size == data.length) {
            // 数组扩容
            T[] newData = (T[]) new Object[data.length * 2]; // 常见的扩容策略是原长度的两倍
            System.arraycopy(data, 0, newData, 0, data.length);
            data = newData;
        }
        data[size++] = t; // 将元素添加到数组的末尾，并更新 size
        return true;
    }

    /**
     * 获取指定位置上的元素
     *
     * @param index 元素的索引
     * @return 指定位置上的元素，如果索引无效则返回 null
     */
    public T get(int index) {
        if (index >= 0 && index < size) {
            return data[index];
        }
        return null;
    }

    /**
     * 删除指定位置上的元素，并将被删除的元素返回
     *
     * @param index 要删除的元素的索引
     * @return 被删除的元素，如果索引无效则返回 null
     */
    public T remove(int index) {
        if (index >= 0 && index < size) {
            T t = data[index];
            System.arraycopy(data, index + 1, data, index, size - index - 1);
            data[size - 1] = null; // 清除最后一个元素，帮助垃圾回收
            size--;
            return t;
        }
        return null;
    }

    /**
     * 返回当前集合的元素个数
     *
     * @return 当前集合的元素个数
     */
    public int size() {
        return size;
    }

    // 其他方法（如 contains, set, toString）保持不变，但需要基于 size 而不是 data.length

    /**
     * 判断集合是否包含给定元素
     *
     * @param t 要检查的元素
     * @return 如果集合包含该元素，则返回 true
     */
    public boolean contains(T t) {
        for (int i = 0; i < size; i++) {
            if (data[i].equals(t)) {
                return true;
            }
        }
        return false;
    }

    // 其他方法（如 set, toString）的实现已足够，但请确保在 toString 中使用 size 而不是 data.length

    @Override
    public String toString() {
        if (size > 0) {
            StringBuilder sb = new StringBuilder();
            sb.append("[");
            for (int i = 0; i < size; i++) {
                sb.append(data[i]);
                if (i < size - 1) {
                    sb.append(",");
                }
            }
            sb.append("]");
            return sb.toString();
        }
        return "[]";
    }
}